package com.web;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.Number;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.service.UserService;
import com.vo.UserVO;

/**  
 * @Class Name : UserController.java
 * @Description : User Simple CRUD
 * @Modification Information  
 * @
 * @  수정일      수정자              수정내용
 * @ ---------   ---------   -------------------------------
 * @ 2013.04.29    ljh       			최초생성
 * @ 2013.04.30    jhm					전체목록 조회 기능 추가		
 * @ 2013.06.18	   ljh					엑셀파일 다운로드 기능 추가
 * 
 * @author ljh
 * @since 2013. 04.29
 * @version 1.0
 * @see 
 * 
 *  Copyright (C) by Daou All right reserved.
 */

@Controller
public class UserController {
	@Resource(name="userService")
	private UserService service;
	
	/*
	 * 메인페이지로 이동한다.
	 */
	@RequestMapping("/mainView.do")
	public String index() throws Exception{
		return "/main";
	}
	
	/*
	 * 회원을 등록하기 위한 폼으로 이동한다. 
	 * @return "/inputInfoUser"
	 * @exception Exception
	 */
	@RequestMapping("registerUser.do")
	public String inputUserForm() throws Exception{
		return "/inputInfoUser";
	}
	
	/*
	 * 파라미터를 가지고 회원 등록
	 * @param 
	 * @return /inputResultForm 
	 */
	@RequestMapping("inputUser.do")
	public String registerUser(@ModelAttribute("UserVO")UserVO userVo, Model model ) throws Exception{
		String id = userVo.getId();
		if(checkEmptyID(id) >0){
			service.registerUser(userVo);
			model.addAttribute("user", userVo);
		}
		else if(checkEmptyID(id) <0){
			model.addAttribute("message", "이미 등록된 ID 입니다.");
		}
		return "/inputResultForm";
	}
	
	/*
	 * 검색창(폼)으로 이동한다.
	 *  @return /searchUser
	 */
	@RequestMapping("/searchUser.do")
	public String searchView()throws Exception{
		return "/searchUser";
	}
	
	/*
	 * 넘어온 파라미터를 가지고 개인 회원을 검색한다. 
	 * @param id, model
	 * @return "/userList"
	 * @exception Exception
	 */
	@RequestMapping("/oneUser.do")
	public String selectUserById(@RequestParam("id")String id, Model model) {
		UserVO user = new UserVO();
		try {
			user = service.selectUserById(id);
			System.out.println(user.toString());
		} catch (Exception e) {
			model.addAttribute("message", "찾는 ID가 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
		model.addAttribute("user", user);
		return "/oneUserView";
	}
	
	/*
	 * 모든 회원을 검색한다.
	 * @return "/allUserView"
	 * @exception Exception
	 *  
	 */
	@RequestMapping("/allUser.do")
	public String selectUserList(Model model){
		ArrayList<UserVO> list = new ArrayList<UserVO>();
		try{
			list = service.selectUserList();
			if(!list.isEmpty()){ //회원이 존재하지 않는 경우 true
			} else{ //회원이 존재하지 않는 경우 false
				model.addAttribute("message","회원이 존재하지 않습니다.");
				return "forward:/error.do";
			}
		}catch(Exception e){
			model.addAttribute("message","회원이 존재하지 않습니다.");
			System.out.println(e.getMessage());
			e.printStackTrace();
			return "forward:/error.do";
		}
		model.addAttribute("selectUserList",list);
		return "/allUserView";		
	}
	/*
	 * 회원정보를 수정하기 위해 user정보를 가지고 폼으로 이동한다. 
	 * @param model
	 * @return "/userList"
	 * @exception Exception
	 */
	@RequestMapping("/modifyUserForm.do")
	public String modifyUser(@RequestParam String id, Model model) throws Exception{
		UserVO user = new UserVO();
		user = service.selectUserById(id);
		System.out.println(user.toString());
		model.addAttribute("user", user);
		return "/modifyUserForm";
	}
	
	@RequestMapping("/modifyUser.do")
	public String modifyUserForm(@ModelAttribute("UserVO")UserVO userVo, Model model) throws Exception{
		UserVO userVO = service.updateUser(userVo);
		model.addAttribute("user", userVO);
		model.addAttribute("message", "수정이 완료되었습니다.");
		return "/oneUserView";
	}
	
	/*
	 * 회원을 제거한다.
	 * @param model, id, session
	 * @return "/deleteUserResult"
	 * @exception Exception
	 */
	@RequestMapping("removeUser.do")
	public String removeUser(@RequestParam("id") String id, Model model,HttpSession session) throws Exception{
		service.removeUser(id);
		model.addAttribute("id", id);
		session.invalidate();
		return "/deleteUserResult";
	}
	
	/**공통 로그인 폼으로 이동한다.
	 * @param accessType
	 * @param model
	 * @return /login
	 */
	@RequestMapping("/loginForm.do")
	public String loginForm(@RequestParam(value="accessType", required=false )String accessType, Model model){
		model.addAttribute("accessType", accessType);
		return "/login";
	}
	
	@RequestMapping("/login.do")
	public String login(@RequestParam(value="accessType", required=false )String accessType, @RequestParam("id") String id, @RequestParam("password") String password, Model model,HttpSession session){
		UserVO user = null;
		try{
			if(id.equals(null) || id.equals("")){
				model.addAttribute("message","ID를 입력하세요.");
				return "/main";
			}
			if(password.equals(null) || password.equals("")){
				model.addAttribute("message","PW를 입력하세요.");
				return "/main";
			}
			user =service.selectUserById(id);
			
			if(password.equals(user.getPassword())){
				model.addAttribute("message",id+"님 환영합니다.");
				session.setAttribute("user", user);
			}
			else{
				model.addAttribute("message","패스워드가 틀렸습니다.");
			}
		} catch(NullPointerException ne){
			model.addAttribute("message","해당 ID가 존재하지 않습니다.");
		} catch(Exception e){
			model.addAttribute("message","에러발생!");
			e.printStackTrace();
			return "forward:/error.do";
		}
		if(accessType!=null || accessType!=""){		//로그인이 필요한 타입을 거쳐 상황에 따라 url 변경
			if(accessType.equals("typeOne")){
				return "/type/typeOne";
			} else if(accessType.equals("typeTen")){
				return "/type/typeTen";
			}
		}
		return "/searchUser";
	}
	
	@RequestMapping("/logout.do")
	public String logout( Model model,HttpSession session, SessionStatus status){
		model.addAttribute("message", "로그아웃되었습니다.");
		status.setComplete();
		session.invalidate();
		return "/searchUser";
	}
	
	public int checkEmptyID(String id) throws Exception{
		int num = 0;
		UserVO user= service.selectUserById(id);
		//등록된 ID 가 없으므로 등록 가능
		if(user==null || user.equals(null)){
			num = 1;
		}
		//등록된 ID가 있으므로 등록 불가능
		else if(user !=null){
			num = -1;
		}
		return num;
	}
	
	/**
	 * 사용자리스트 엑셀로 다운로드하기
	 * @param model
	 * @return	리스트페이지 refresh
	 */
	@RequestMapping("/inputExcelUserList.do")
	public String InputExcelUser(Model model){
		ArrayList<UserVO> list = new ArrayList<UserVO>();
		try {
			WritableWorkbook workbook = Workbook.createWorkbook(new File("c:/userList.xls"));	//파일생성
			WritableSheet sheet1 = workbook.createSheet("sheet1", 0);					//시트생성
			//WritableSheet sheet2 = workbook.createSheet("sheet2", 0);
			for(int i=0; i<6; i++){
				sheet1.setColumnView(i, 20);	// i 열 -넓이 설정
			}
			sheet1.setRowView(0, 450);		//0 행 - 높이 설정
			WritableCellFormat integerFormat = new WritableCellFormat(NumberFormats.INTEGER);		//숫자포맷
			WritableCellFormat bgFormat = new WritableCellFormat(
					new WritableFont(WritableFont.ARIAL,  10, WritableFont.BOLD,  false, UnderlineStyle.SINGLE,  Colour.DARK_BLUE, ScriptStyle.NORMAL_SCRIPT));		
			bgFormat.setBackground(Colour.LIGHT_TURQUOISE);	//배경색설정(나중에 주입)
			// 좌우정렬 : GENERAL, LEFT, CENTRE, RIGHT, FILL, JUSTIFY
			//celFormat.setAlignment(Alignment.CENTRE);    
			   
			// 상하정렬 : TOP, CENTRE, BOTTOM, JUSTIFY
			//celFormat.setVerticalAlignment(VerticalAlignment.CENTRE); 
			   
			// 선 위치 : NONE, ALL, TOP, BOTTOM, LEFT, RIGHT
			// 선 종류 :  NONE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR, MEDIUM_DASHED, DASH_DOT, MEDIUM_DASH_DOT, DASH_DOT_DOT, MEDIUM_DASH_DOT_DOT, SLANTED_DASH_DOT
			//celFormat.setBorder(Border.ALL, BorderLineStyle.DOTTED);  
			   
			// 배경색 지정
			//celFormat.setBackground(Colour.GREEN);       

			String [] title = {"ID","패스워드","이름","이메일","핸드폰번호","생일"};
			Label label = new Label(0,0,"회원 리스트",bgFormat);			// 열,행,데이터,포맷
			sheet1.addCell(label);				// 생성된 시트에 cell 추가
			
			for(int i=0; i<title.length; i++){	
				Label content = new Label(i, 1, title[i], bgFormat);
				sheet1.addCell(content);			
			}
			
			list = service.selectUserList();
			if(!list.isEmpty()){ 	// 회원이 있다면
				for(int i=0; i<list.size(); i++){	//회원수만큼 엑셀시트에 추가
					UserVO user = new UserVO();
					user = list.get(i);
					Label userID = new Label(0, i+2, user.getId());
					Label userPW = new Label(1, i+2, user.getPassword() );
					Label userName = new Label(2, i+2, user.getName());
					Label userEmail = new Label(3, i+2, user.getEmail() );
					Label userPhoneNum = new Label(4, i+2, user.getPhoneNum());
					Number userBirth = new Number(5, i+2, user.getBirthday(),integerFormat );	//숫자입력시
					sheet1.addCell(userID);
					sheet1.addCell(userPW);
					sheet1.addCell(userName);
					sheet1.addCell(userEmail);
					sheet1.addCell(userPhoneNum);
					sheet1.addCell(userBirth);
				}
			} else{ //회원이 존재하지 않는 경우 false
				model.addAttribute("message","회원이 존재하지 않습니다.");
				return "forward:/error.do";
			}
			workbook.write();
			workbook.close();
			model.addAttribute("selectUserList",list);
			model.addAttribute("message","엑셀파일이 c:/userList.xls 위치에 다운로드되었습니다.");
			
		} catch (IOException ioe) {
			model.addAttribute("message",ioe.getMessage()+" : 파일오류");
			ioe.printStackTrace();
			return "forward:/error.do";
		} catch (WriteException we) {
			model.addAttribute("message",we.getMessage()+" : 엑셀닫기오류");
			we.printStackTrace();
			return "forward:/error.do";
		} catch (SQLException sqle) {
			sqle.printStackTrace();
			model.addAttribute("message",sqle.getMessage());
			return "forward:/error.do";
		}
		return "/allUserView";
	}
	
}
